#include <brpc/server.h>
#include <butil/logging.h>
#include "main.pb.h"

// 1. 创建子类, 继承于EchoService, 并实现rpc调用业务功能

//EchoServiceImpl是什么？
//重写业务逻辑         brpc::ClosureGuard是什么？？
//
class EchoServiceImpl : public example::EchoService
{
public:
    void Echo(google::protobuf::RpcController *controller,  // 用于控制 RPC 调用和获取状态信息
              const ::example::EchoRequest *request,  // 客户端发送的请求消息
              ::example::EchoResponse *response,  // 需要填充的响应消息
              ::google::protobuf::Closure *done) // 回调对象，主要应用于异步请求，处理完成后需要调用它 
    {
        brpc::ClosureGuard rpc_guard(done);
        std::cout << "收到消息: " << request->message() << std::endl;

        std::string str = request->message() + "这是一个响应！！";
        response->set_message(str);
    }
};
int main()
{
    // 关闭brpc的默认日志输出
    logging::LoggingSettings settings;
    settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;
    logging::InitLogging(settings);

    // 2. 构造服务器对象
    brpc::Server server;
    // 3. 向服务器对象中，新增EchoService服务
    EchoServiceImpl echo_service;
    //AddService是什么意思？？  brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE表示啥？？
    int ret = server.AddService(&echo_service, brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);
    if (ret == -1)
    {
        std::cout << "添加Rpc服务失败!\n";
        return -1;
    }
    // 4. 启动服务器
    brpc::ServerOptions options;
    //options.idle_timeout_sec是啥意思 ---和etcd租约没有任何关系！
    options.idle_timeout_sec = -1; // 连接空闲超时时间-超时后连接被关闭   -1表示禁用连接空闲超时
    options.num_threads = 1;       // io线程数量
    ret = server.Start(9090, &options);
    if (ret == -1)
    {
        std::cout << "启动服务器失败!\n";
        return -1;
    }
    server.RunUntilAskedToQuit(); // 保持服务器运行，直到收到终止信号
    return 0;
}
